import qs from '@/node_modules/qs'

/**
 * 将数字四舍五入到指定小数位，并移除结果末尾的零。
 * 如果结果以小数点结尾，也会移除该小数点。
 *
 * @param number 需要进行四舍五入的数字。
 * @param digits 指定保留的小数位数。
 * @return 返回四舍五入后的字符串，移除了末尾的零和可能的小数点。
 */
export function myToFixed(number, digits) {
	let value = number
	// 检查是否为字符串
	if (typeof value === 'string') {
		// 尝试将字符串转换为数字
		const number = Number(value)

		// 检查转换结果是否为有效数字
		if (!isNaN(number)) {
			return number
		} else {
			console.warn('无法将提供的字符串转换为数字: ', value)
			return value // 或者可以选择返回 null, false 等表示转换失败
		}
	} else {
		// 如果不是字符串，直接返回原值
		return value
	}
	let result = value.toFixed(digits)
	while (result.endsWith('0')) {
		result = result.slice(0, -1)
	}
	if (result.endsWith('.')) {
		result = result.slice(0, -1)
	}
	return result
}
export function roundAndPad(number, decimalPlaces) {
	// 首先，使用 toFixed 方法确保小数点后的位数，并四舍五入
	let roundedNumber = Number(number).toFixed(decimalPlaces)

	// 如果需要返回数值而非字符串，可以将其转换回数值
	// 注意：这里我们直接返回字符串形式，因为数值类型会自动去除尾部的零
	return roundedNumber
}
// 小驼峰转下划线函数
export const camelToSnake = (obj) => {
	if (obj === null || typeof obj !== 'object') return obj

	if (Array.isArray(obj)) {
		return obj.map((item) => camelToSnake(item))
	}

	return Object.keys(obj).reduce((acc, key) => {
		const newKey = key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)
		const value = obj[key]

		acc[newKey] = typeof value === 'object' ? camelToSnake(value) : value
		return acc
	}, {})
}

// 下划线转小驼峰函数
export const snakeToCamel = (obj) => {
	if (obj === null || typeof obj !== 'object') return obj

	if (Array.isArray(obj)) {
		return obj.map((item) => snakeToCamel(item))
	}

	return Object.keys(obj).reduce((acc, key) => {
		const newKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())
		const value = obj[key]

		acc[newKey] = typeof value === 'object' ? snakeToCamel(value) : value
		return acc
	}, {})
}

// 秒数转换
export function formatTime(seconds) {
	if (typeof seconds !== 'number' || seconds < 0) {
		throw new Error('请输入有效的非负秒数')
	}

	const mins = Math.floor(seconds / 60) // 计算分钟数
	const secs = seconds % 60 // 计算剩余的秒数

	// 使用 padStart 确保分钟和秒数都是两位数
	return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
}

// 对象转url需要的查询字符串格式
export function objToParams(data) {
	if (Object.keys(data).length === 0) return data
	let queryString = qs.stringify(data);
	return queryString
}

// 获取url参数
export function getUrlQuery(key) {
	const urlParams = new URLSearchParams(window.location.search);
	const urlVal = urlParams.get(key);
	if (urlVal) {
		return urlVal;
	}
}

/**
 * 深度比较两个对象是否相等
 * @param {*} a - 第一个比较对象
 * @param {*} b - 第二个比较对象
 * @returns {boolean} - 返回比较结果，true表示相等，false表示不等
 */
export function deepEqual(a, b) {
	// 基本类型直接比较
	if (a === b) return true

	// 非对象类型或null值直接返回false
	if (typeof a !== 'object' || typeof b !== 'object' || a == null || b == null) return false

	// 比较对象key的数量
	const keysA = Object.keys(a)
	const keysB = Object.keys(b)
	if (keysA.length !== keysB.length) return false

	// 递归比较每个key对应的值
	for (let key of keysA) {
		if (!keysB.includes(key)) return false
		if (!deepEqual(a[key], b[key])) return false
	}

	return true
}

/**
 * 防抖函数
 * @param {Function} func
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function debounce(func, wait, immediate) {
	let timeout, args, context, timestamp, result

	const later = function() {
		const last = Date.now() - timestamp

		if (last < wait && last > 0) {
			timeout = setTimeout(later, wait - last)
		} else {
			timeout = null
			if (!immediate) {
				result = func.apply(context, args)
				context = args = null
			}
		}
	}

	return function(...params) {
		context = this
		args = params
		timestamp = Date.now()

		const callNow = immediate && !timeout

		if (!timeout) {
			timeout = setTimeout(later, wait)
		}

		if (callNow) {
			result = func.apply(context, args)
			context = args = null
		}

		return result
	}
}

// 获取单位
export function extractUnit(value) {
	// 使用正则表达式匹配数字后的单位部分
	const match = value.toString().trim().match(/(\d+\.?\d*)([a-z%]*)$/)

	if (match && match[2]) {
		// 如果有单位，返回单位
		return match[2]
	} else {
		// 如果没有明确的单位，默认假设为像素(px)
		return 'px'
	}
}

// 小程序获取环境信息 开发、体验、正式
export function getMpEnvSync() {
	// #ifdef MP-ALIPAY
	try {
		const res = my.getAccountInfoSync();
		const envVersion = res.miniProgram.envVersion || 'unknown';
		return envVersion
	} catch (error) {
		return 'unknown';
	}
	// #endif
	// #ifdef MP-WEIXIN
	const env = typeof __wxConfig !== 'undefined' ? __wxConfig.envVersion : 'unknown';
	return env
	// #endif
}

// 通过url获取路径的参数
export const urlToObj = function(url) {
	let obj = {}
	let str = url.slice(url.indexOf('?') + 1)
	let arr = str.split('&')
	for (let j = arr.length, i = 0; i < j; i++) {
		let arr_temp = arr[i].split('=')
		obj[arr_temp[0]] = arr_temp[1]
	}
	return obj
}